/*
* 复制文本的指令
*/
import type{App,DirectiveBinding} from "vue"

function SpellCheckMain(app:App, options:any) {
    // let checkerId = 0;      // 定义初始数字，在创建新标签的时候用
    const cssText = 'position:fixed;pointer-events:none;z-index:-9999;opacity:0;'
    let errortext = "浏览器不支持，复制失败"
    // 主要处理过程
    function chuli(el:any,value:string) {
        // 初始化各种状态
        errortext = "浏览器不支持，复制失败"
        let thisdata
        if(typeof value!=="string"){
            try{
                thisdata = JSON.stringify(value)
            }catch(e){
                errortext = "数据类型无法转化复制"
                const callback = el.error || null;
                if(callback){
                    callback(errortext,el)
                }else{
                    console.log(errortext)
                }
                return
            }
        }else{
            thisdata = value
        }
        // 创建一个input 元素
        // createElement() 方法通过指定名称创建一个元素，给这个元素添加样式
        const textarea = document.createElement('textarea')
        textarea.value = thisdata  // 将内容赋值给文本域
        textarea.setAttribute('readonly', '')
        textarea.style.cssText = cssText
        // appendChild() 方法向节点添加最后一个子节点。
        document.body.appendChild(textarea);
        // 选中input元素中的文本
        // select() 方法用于选择该元素中的文本。复制一个完整的判断。
        if (navigator.userAgent.match(/ipad|ipod|iphone/i)) {
            textarea.contentEditable = String(true)
            textarea.readOnly = true

            const range = document.createRange()

            range.selectNodeContents(textarea)

            const selection:Selection | null = window.getSelection()

            selection && selection.removeAllRanges()
            selection && selection.addRange(range)
            textarea.setSelectionRange(0, 999999)
        } else {
            textarea.select()
        }

        // 执行浏览器复制命令
        //  execCommand方法是执行一个对当前文档，当前选择或者给出范围的命令
        try {
            document.execCommand('Copy')
            // 清空输入框
            textarea.remove();
            const callback = el.success || null;
            if(callback){
                callback(thisdata,el)
            }else{
                console.log(`${thisdata}复制成功`)
            }
        } catch (err) {
            const callback = el.error || null;
            if(callback){
                callback(errortext,el)
            }else{
                console.log(errortext)
            }
        }

    }
    function fenfa(el:HTMLElement,binding:DirectiveBinding){
        console.log(binding,el)
        const {arg, value} = binding
        switch (arg) {
            case "success":
                break
            case "error":
                break
            default:
                chuli(el,value)
        }
    }
    app.directive('clipboard', {
        beforeMount:function(el,binding){
            const {arg, value} = binding
            switch (arg){
                case "error":
                    el.error = value
                    break
                case "success":
                    el.success = value
                    break
                default:
                    el.chuli = chuli
            }
        },
        mounted: function (el, binding, vnode, oldVnode) {
            el.addEventListener("click", () => {fenfa(el,binding)})
        },
        unmounted: function (el, binding, vnode, oldVnode) {
            el.removeEventListener("click",() => {fenfa(el,binding)})
        }
    })
}

export default {
    install: SpellCheckMain
}
